﻿--- Eliminar las funciones existentes sin importar el numero ni tipo de parametros
SELECT * FROM "DropFunction_AWIL"('FuncMaeBarrio');
--- crear una nueva funcion
CREATE OR REPLACE FUNCTION "FuncMaeBarrio"(
	 IN	"@OP" CHARACTER VARYING(64)
	,IN	"@paramAux" TEXT
	,INOUT	"@id" INTEGER
	,INOUT	"@fechaGrab" timestamp
	,INOUT	"@usuarioGrab" character varying(32)
	,INOUT	"@activo" boolean
	,INOUT	"@codMaeBarrio" character varying(32)
	,INOUT	"@codMaeCiudad" character varying(16)
	,INOUT	"@nombreMaeBarrio" character varying(64)
	,INOUT	"@localidad" character varying(32)
)RETURNS 
	SETOF RECORD
AS $$ 
DECLARE
	Auxiliar TEXT;
	pagina INTEGER;
	numRegistrosPorPagina INTEGER;
	campoFiltroOrden character varying(64);
	valorFiltro character varying(64);
BEGIN

	/*SELECT BY CODIGO*/
	IF "@OP"='selectById' THEN
		RETURN QUERY SELECT "id","fechaGrab","usuarioGrab","activo","codMaeBarrio","codMaeCiudad","nombreMaeBarrio","localidad" FROM "MaeBarrio" WHERE "id"="@id";
	RETURN;
	END IF;
	
	/*SELECT BY CODIGO*/
	IF "@OP"='selectByCodigo' THEN
		RETURN QUERY SELECT "id","fechaGrab","usuarioGrab","activo","codMaeBarrio","codMaeCiudad","nombreMaeBarrio","localidad" FROM "MaeBarrio" WHERE "codMaeBarrio"="@codMaeBarrio";
	RETURN;
	END IF;
	
	/*SELECT TODOS*/
	IF "@OP"='selectAll' THEN
		--- obtengo la pagina
		pagina = coalesce(CAST((string_to_array("@paramAux",'|'))[1] as INTEGER),0); 
		--- obtengo el numero de registros por pagina
		numRegistrosPorPagina = coalesce(CAST((string_to_array("@paramAux",'|'))[2] as INTEGER),-1); 
		--- obtengo el campo por el cual se ordenara y filtrara la info
		campoFiltroOrden = coalesce(trim((string_to_array("@paramAux",'|'))[3]),''); 
		--- obtengo el valor con el cual se realizara el filtro (sino se selecciono ningun campo, inicializo el valor con '')
		valorFiltro = CASE WHEN campoFiltroOrden='' THEN '' ELSE coalesce(trim((string_to_array("@paramAux",'|'))[4]),'') END;

		if valorFiltro<>'' THEN
			IF campoFiltroOrden='activo' THEN
				--- si se selecciono el campo "activo", formateo el campo valor (true, false)
				valorFiltro=CASE WHEN lower(valorFiltro)='si' OR lower(valorFiltro)='s' THEN 'true'  WHEN lower(valorFiltro)='no' OR lower(valorFiltro)='n' THEN 'false' ELSE '' END;
			ELSE
				--- si se definio un valor para filtrar, le agrego los caracteres de comodin para que la busqueda sea mas flexible
				
				valorFiltro= '%' ||  valorFiltro || '%';
			END IF;
				
		END IF;
		
		--- con esta sentencia muestro todos los resultados de la tabla
		if numRegistrosPorPagina<0 then 
			numRegistrosPorPagina=1000000;
		end if;

		
		RETURN	
			QUERY 
		SELECT	
			"id","fechaGrab","usuarioGrab","activo","codMaeBarrio","codMaeCiudad","nombreMaeBarrio","localidad" 
		FROM	
			"MaeBarrio"
		WHERE
			(valorFiltro<>'' AND campoFiltroOrden='codMaeBarrio' AND "codMaeBarrio" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='codMaeCiudad' AND "codMaeCiudad" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='nombreMaeBarrio' AND "nombreMaeBarrio" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='localidad' AND "localidad" ILIKE valorFiltro)
			OR
			(valorFiltro<>'' AND campoFiltroOrden='activo' AND "activo" = CAST(valorFiltro AS BOOLEAN))
			OR
			valorFiltro=''
		ORDER BY 
			CASE
				WHEN campoFiltroOrden='codMaeBarrio' THEN "codMaeBarrio"
				WHEN campoFiltroOrden='codMaeCiudad' THEN "codMaeCiudad"
				WHEN campoFiltroOrden='nombreMaeBarrio' THEN "nombreMaeBarrio"
				WHEN campoFiltroOrden='localidad' THEN "localidad"
				WHEN campoFiltroOrden='activo' THEN CAST("activo" AS  character varying(1))
			END ASC
		       ,"nombreMaeBarrio" ASC
		LIMIT 
			numRegistrosPorPagina 
		OFFSET 
			numRegistrosPorPagina*pagina;
	RETURN;
	END IF;

	/*INSERTAR NUEVO REGISTRO*/
	IF "@OP"='insert' THEN

		--- Verifico el CODIGO
		IF ''="@codMaeBarrio" THEN
			Auxiliar = 'Digite el codigo.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico el NOMBRE
		IF ''="@nombreMaeBarrio" THEN
			Auxiliar = 'Digite el nombre.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista  con ese CODIGO
		IF EXISTS (SELECT 1 FROM "MaeBarrio" WHERE "codMaeBarrio"="@codMaeBarrio") THEN
			Auxiliar = 'Ya existe un Barrio con el codigo "' || "@codMaeBarrio" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista con ese NOMBRE
		IF EXISTS (SELECT 1 FROM "MaeBarrio" WHERE "nombreMaeBarrio"="@nombreMaeBarrio") THEN
			Auxiliar = 'Ya existe un Barrio con el Nombre "' || "@nombreMaeBarrio" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista la ciudad
		IF NOT EXISTS (SELECT 1 FROM "MaeCiudad" WHERE "codMaeCiudad"="@codMaeCiudad") THEN
			Auxiliar = 'La ciudad indicada no existe, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que la ciudad este activa
		IF NOT EXISTS (SELECT 1 FROM "MaeCiudad" WHERE "codMaeCiudad"="@codMaeCiudad" AND activo=true) THEN
			Auxiliar = 'La ciudad indicada NO se encuentra Activa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		
		-- Grabo el registro
		INSERT INTO "MaeBarrio" ("usuarioGrab","usuarioUltMod","activo","codMaeBarrio","codMaeCiudad","nombreMaeBarrio","localidad")
		VALUES	 ("@usuarioGrab","@usuarioGrab",coalesce("@activo",TRUE),"@codMaeBarrio","@codMaeCiudad","@nombreMaeBarrio","@localidad");

		RETURN QUERY SELECT "id","fechaGrab","usuarioGrab","activo","codMaeBarrio","codMaeCiudad","nombreMaeBarrio","localidad" FROM "MaeBarrio" ORDER BY "id" DESC LIMIT 1;
		
	RETURN;
	END IF;

	/*ACTUALIZAR REGISTRO*/
	IF "@OP"='update' THEN

		--- Verifico el CODIGO
		IF ''="@codMaeBarrio" THEN
			Auxiliar = 'Digite el codigo.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico el NOMBRE
		IF ''="@nombreMaeBarrio" THEN
			Auxiliar = 'Digite el nombre.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista  con el nuevo CODIGO
		IF EXISTS (SELECT 1 FROM "MaeBarrio" WHERE "codMaeBarrio"="@codMaeBarrio" AND "id"<>"@id") THEN
			Auxiliar = 'Ya existe Otro Barrio con el codigo "' || "@codMaeBarrio" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que no exista  con ese NOMBRE
		IF EXISTS (SELECT 1 FROM "MaeBarrio" WHERE "nombreMaeBarrio"="@nombreMaeBarrio" AND "id"<>"@id") THEN
			Auxiliar = 'Ya existe Otro Barrio con el Nombre "' || "@nombreMaeBarrio" || '", verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que exista la ciudad
		IF NOT EXISTS (SELECT 1 FROM "MaeCiudad" WHERE "codMaeCiudad"="@codMaeCiudad") THEN
			Auxiliar = 'La ciudad indicada no existe, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- Verifico que la ciudad este activa
		IF NOT EXISTS (SELECT 1 FROM "MaeCiudad" WHERE "codMaeCiudad"="@codMaeCiudad" AND activo=true) THEN
			Auxiliar = 'La ciudad indicada NO se encuentra Activa, verifique.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		--- si se va a cambiar el codigo,Verifico que no se encuentre en uso
		IF 
			EXISTS (SELECT 1 FROM "MaeBarrio" WHERE "codMaeBarrio"<>"@codMaeBarrio" and "id"="@id")
			AND
			EXISTS (SELECT 1 FROM "MaeCliente" t1 inner join "MaeBarrio" t2 on t1."codMaeBarrio"=t2."codMaeBarrio" and t2.id="@id") 
		THEN
			Auxiliar = 'El barrio ' || "@nombreMaeBarrio" || ' Ya se encuentra en uso, NO puede cambiar el codigo.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;

		
		--- Actualizo el registro
		UPDATE	
			"MaeBarrio" 
		SET	
			 "activo"=coalesce("@activo","activo")
			,"fechaUltMod"=NOW() 
			,"usuarioUltMod"="@usuarioGrab" 
			,"codMaeBarrio"="@codMaeBarrio"
			,"codMaeCiudad"="@codMaeCiudad"
			,"nombreMaeBarrio"="@nombreMaeBarrio"			
			,"localidad"="@localidad"
		WHERE	
			"id"="@id";

	RETURN;
	END IF;

	/*ELIMINAR REGISTRO*/
	IF "@OP"='delete' THEN

		--- si se va a cambiar el codigo,Verifico que no se encuentre en uso
		IF 
			EXISTS (SELECT 1 FROM "MaeCliente" t1 inner join "MaeBarrio" t2 on t1."codMaeBarrio"=t2."codMaeBarrio" and t2.id="@id") 
		THEN
			Auxiliar = 'El barrio Ya se encuentra en uso, NO puede ser eliminado.';
			RAISE EXCEPTION '%', Auxiliar;
		END IF;
		
		--- Borro el registro
		DELETE FROM "MaeBarrio" 
		WHERE "id"="@id";

	RETURN;
	END IF;


--- Controlo que se haya digitado el OP correctamente
IF "@OP" IS NOT NULL THEN
	Auxiliar = 'El OP "' || "@OP" || '" No existe, verifique.';
	RAISE EXCEPTION '%', Auxiliar;
RETURN;
END IF;
END;
$$ LANGUAGE 'plpgsql';
